home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic 4 Database How-To / Visual Basic 4 Database - How-to (The Waite Group)(1995).iso / listunb.fr_ / listunb.fr
Text File  |  1995-07-04  |  19KB  |  638 lines

  1. VERSION 4.00
  2. Begin VB.Form Form1 
  3.    BackColor       =   &H00C0C0C0&
  4.    Caption         =   "Unbound Lister"
  5.    ClientHeight    =   2745
  6.    ClientLeft      =   1935
  7.    ClientTop       =   2040
  8.    ClientWidth     =   6420
  9.    BeginProperty Font 
  10.       name            =   "MS Sans Serif"
  11.       charset         =   0
  12.       weight          =   700
  13.       size            =   8.25
  14.       underline       =   0   'False
  15.       italic          =   0   'False
  16.       strikethrough   =   0   'False
  17.    EndProperty
  18.    Height          =   3435
  19.    Left            =   1875
  20.    LinkTopic       =   "Form1"
  21.    ScaleHeight     =   2745
  22.    ScaleWidth      =   6420
  23.    Top             =   1410
  24.    Width           =   6540
  25.    Begin VB.ComboBox cboPublishers 
  26.       Height          =   300
  27.       Left            =   1860
  28.       Sorted          =   -1  'True
  29.       Style           =   2  'Dropdown List
  30.       TabIndex        =   10
  31.       Top             =   1380
  32.       Width           =   4035
  33.    End
  34.    Begin VB.CommandButton cmdMove 
  35.       Caption         =   ">|"
  36.       Height          =   375
  37.       Index           =   3
  38.       Left            =   3660
  39.       TabIndex        =   9
  40.       Top             =   2100
  41.       Width           =   375
  42.    End
  43.    Begin VB.CommandButton cmdMove 
  44.       Caption         =   ">"
  45.       Height          =   375
  46.       Index           =   2
  47.       Left            =   3300
  48.       TabIndex        =   8
  49.       Top             =   2100
  50.       Width           =   375
  51.    End
  52.    Begin VB.CommandButton cmdMove 
  53.       Caption         =   "<"
  54.       Height          =   375
  55.       Index           =   1
  56.       Left            =   2940
  57.       TabIndex        =   7
  58.       Top             =   2100
  59.       Width           =   375
  60.    End
  61.    Begin VB.CommandButton cmdMove 
  62.       Caption         =   "|<"
  63.       Height          =   375
  64.       Index           =   0
  65.       Left            =   2580
  66.       TabIndex        =   6
  67.       Top             =   2100
  68.       Width           =   375
  69.    End
  70.    Begin VB.TextBox txtISBN 
  71.       DataField       =   "ISBN"
  72.       DataSource      =   "dtaTitles"
  73.       Height          =   315
  74.       Left            =   4260
  75.       MaxLength       =   13
  76.       TabIndex        =   2
  77.       Top             =   900
  78.       Width           =   1635
  79.    End
  80.    Begin VB.TextBox txtYearPublished 
  81.       DataField       =   "Year Published"
  82.       DataSource      =   "dtaTitles"
  83.       Height          =   285
  84.       Left            =   1860
  85.       TabIndex        =   1
  86.       Top             =   900
  87.       Width           =   735
  88.    End
  89.    Begin VB.TextBox txtTitle 
  90.       DataField       =   "Title"
  91.       DataSource      =   "dtaTitles"
  92.       Height          =   555
  93.       Left            =   1860
  94.       MultiLine       =   -1  'True
  95.       TabIndex        =   0
  96.       Top             =   180
  97.       Width           =   4095
  98.    End
  99.    Begin VB.Label Label4 
  100.       AutoSize        =   -1  'True
  101.       BackColor       =   &H00C0C0C0&
  102.       Caption         =   "Publisher:"
  103.       Height          =   195
  104.       Left            =   840
  105.       TabIndex        =   11
  106.       Top             =   1440
  107.       Width           =   855
  108.    End
  109.    Begin VB.Label Label3 
  110.       AutoSize        =   -1  'True
  111.       BackColor       =   &H00C0C0C0&
  112.       Caption         =   "ISBN:"
  113.       Height          =   195
  114.       Left            =   3600
  115.       TabIndex        =   5
  116.       Top             =   960
  117.       Width           =   510
  118.    End
  119.    Begin VB.Label Label2 
  120.       AutoSize        =   -1  'True
  121.       BackColor       =   &H00C0C0C0&
  122.       Caption         =   "Year Published:"
  123.       Height          =   195
  124.       Left            =   360
  125.       TabIndex        =   4
  126.       Top             =   960
  127.       Width           =   1350
  128.    End
  129.    Begin VB.Label Label1 
  130.       AutoSize        =   -1  'True
  131.       BackColor       =   &H00C0C0C0&
  132.       Caption         =   "Title:"
  133.       Height          =   195
  134.       Left            =   1200
  135.       TabIndex        =   3
  136.       Top             =   180
  137.       Width           =   450
  138.    End
  139.    Begin VB.Menu mnuFile 
  140.       Caption         =   "&File"
  141.       Begin VB.Menu mnuFileExit 
  142.          Caption         =   "E&xit"
  143.       End
  144.    End
  145.    Begin VB.Menu mnuEdit 
  146.       Caption         =   "&Edit"
  147.       Begin VB.Menu mnuEditUndo 
  148.          Caption         =   "&Undo"
  149.          Shortcut        =   %{BKSP}
  150.       End
  151.    End
  152.    Begin VB.Menu mnuData 
  153.       Caption         =   "&Data"
  154.       Begin VB.Menu mnuSaveRecord 
  155.          Caption         =   "&Save Record"
  156.       End
  157.       Begin VB.Menu mnuDataIndex 
  158.          Caption         =   "&Index"
  159.          Begin VB.Menu mnuDataIndexISBN 
  160.             Caption         =   "&ISBN"
  161.          End
  162.          Begin VB.Menu mnuDataIndexTitle 
  163.             Caption         =   "&Title"
  164.          End
  165.       End
  166.       Begin VB.Menu mnuDataSeek 
  167.          Caption         =   "See&k"
  168.       End
  169.    End
  170. End
  171. Attribute VB_Name = "Form1"
  172. Attribute VB_Creatable = False
  173. Attribute VB_Exposed = False
  174. Option Explicit
  175.  
  176. Private rsTitles As Recordset
  177. Private rsPublishers As Recordset
  178. Private DataChanged As Boolean
  179. Private DisplayingRecord
  180. Private MoveCancelled As Boolean
  181.  
  182.  
  183.  
  184. Private Sub cmdMove_Click(Index As Integer)
  185.  
  186.     ' The user clicked one of the move buttons. The button clicked is
  187.     ' passed as the Index argument. The four local Const declarations
  188.     ' represent the possible values of Index
  189.  
  190.     Const MOVE_FIRST = 0
  191.     Const MOVE_PREVIOUS = 1
  192.     Const MOVE_NEXT = 2
  193.     Const MOVE_LAST = 3
  194.  
  195.     Dim msg As String
  196.  
  197.     If DataChanged Then
  198.  
  199.         ' The data have changed, so verify that the user wants to save
  200.         ' the changes to the database.
  201.         msg = "Do you want to save the changes you've made "
  202.         msg = msg & " to the current Title?"
  203.  
  204.         Select Case MsgBox(msg, vbQuestion + vbYesNoCancel)
  205.             Case vbYes
  206.  
  207.                 ' The user wants to save.
  208.                 SaveRecord
  209.             Case vbNo
  210.  
  211.                 ' The user does not want to save, so simply do nothing
  212.  
  213.             Case vbCancel
  214.  
  215.                 ' The user clicked Cancel, so set the flag to abort the move
  216.                 MoveCancelled = True
  217.         End Select
  218.     End If
  219.  
  220.     If Not MoveCancelled Then
  221.  
  222.         ' The move has not been cancelled, so move to the indicated record.
  223.         Select Case Index
  224.             Case MOVE_FIRST
  225.                 rsTitles.MoveFirst
  226.             Case MOVE_PREVIOUS
  227.                 rsTitles.MovePrevious
  228.  
  229.                 ' If we were already on the first record, moving to the
  230.                 ' previous record put us at BOF. That's not good, so
  231.                 ' so reposition on the first record.
  232.                 If rsTitles.BOF Then rsTitles.MoveFirst
  233.             Case MOVE_NEXT
  234.                 rsTitles.MoveNext
  235.  
  236.                 ' If we were already on the last record, moving to the
  237.                 ' next record put us at EOF. That's not good, so
  238.                 ' so reposition on the last record.
  239.                 If rsTitles.EOF Then rsTitles.MoveLast
  240.             Case MOVE_LAST
  241.                 rsTitles.MoveLast
  242.         End Select
  243.  
  244.         ' Read the values from the new current record and display them
  245.         ' in the controls on the form.
  246.         DisplayRecord
  247.     End If
  248.  
  249. End Sub
  250.  
  251. Private Sub DisplayRecord()
  252.     Dim i As Integer
  253.  
  254.     ' Set the DisplayingRecord flag to prevent the cboPublishers_Click
  255.     ' event from changing the DataChanged flag.
  256.     DisplayingRecord = True
  257.  
  258.     ' Check each field in the recordset to make sure it's non-null.
  259.     ' If it is, display it in the corresponding control. If it is null,
  260.     ' display an empty string in the control.
  261.     If Not IsNull(rsTitles![Title]) Then txtTitle = rsTitles![Title] Else txtTitle = ""
  262.     If Not IsNull(rsTitles![Year Published]) Then txtYearPublished = rsTitles![Year Published] Else txtYearPublished = ""
  263.     If Not IsNull(rsTitles![ISBN]) Then txtISBN = rsTitles![ISBN] Else txtISBN = ""
  264.  
  265.     ' Search through the ItemData in the publishers list box until a match
  266.     ' for the PubID in the Titles recordset is found. When a match is found,
  267.     ' set the ListIndex to the current item index.
  268.     cboPublishers.ListIndex = -1
  269.     If Not IsNull(rsTitles![PubID]) Then
  270.         For i = 0 To cboPublishers.ListCount - 1
  271.             If cboPublishers.ItemData(i) = rsTitles![PubID] Then
  272.                 cboPublishers.ListIndex = i
  273.                 Exit For
  274.             End If
  275.         Next i
  276.     End If
  277.  
  278.     ' Clear the DataChanged flag to indicate there's no need to save the
  279.     ' record.
  280.     DataChanged = False
  281.  
  282.     ' Clear the Displaying Record flag.
  283.     DisplayingRecord = False
  284. End Sub
  285.  
  286. Private Sub SaveRecord()
  287.     Dim msg As String
  288.  
  289.     On Error GoTo SaveError
  290.  
  291.     ' Verify that each control has a legal value. If a control has an illegal
  292.     ' value, create a string explaining the problem and set the focus to the
  293.     ' control.
  294.     If txtTitle = "" Then
  295.          msg = "You must enter a title."
  296.          txtTitle.SetFocus
  297.     ElseIf txtISBN = "" Then
  298.          msg = "You must enter an ISBN."
  299.          txtISBN.SetFocus
  300.     ElseIf txtYearPublished <> "" And Not IsNumeric(txtYearPublished) Then
  301.         msg = "The Year Published must be numeric."
  302.         txtYearPublished.SetFocus
  303.     ElseIf cboPublishers.ListIndex = -1 Then
  304.  
  305.         ' If the ListIndex = -1, it means that no list entry is selected.
  306.         msg = "You must enter a publisher."
  307.         txtYearPublished.SetFocus
  308.     End If
  309.  
  310.     If msg = "" Then
  311.  
  312.         ' No error message was built, so the data checked out okay. Set
  313.         ' the hourglass cursor.
  314.         Screen.MousePointer = 11
  315.  
  316.         ' Copy the current record from the recordset rsTitles into the copy buffer.
  317.         rsTitles.Edit
  318.  
  319.         ' Update the fields in the copy buffer.
  320.         WriteRecord
  321.  
  322.         ' Write the copy buffer to the database.
  323.         rsTitles.UPDATE
  324.  
  325.         ' Clear the DataChanged flag to indicate there's no need to save the
  326.         ' record.
  327.         DataChanged = False
  328.         MoveCancelled = False
  329.  
  330.         ' Restore the cursor to the default.
  331.         Screen.MousePointer = 0
  332.     Else
  333.  
  334.         ' There's an error message, so display it.
  335.         MsgBox msg, vbExclamation
  336.     End If
  337.  
  338. Exit Sub
  339.  
  340. SaveError:
  341.  
  342.     ' An error was generated by Visual Basic or the Jet engine.
  343.     ' Set the cursor to the default and display the error message.
  344.     Screen.MousePointer = 0
  345.     MsgBox Err.Description
  346.  
  347. Exit Sub
  348.  
  349. End Sub
  350.  
  351. Private Sub WriteRecord()
  352.  
  353.     ' Update each field in the Titles recordset from the value of the
  354.     ' associated text control on the form.
  355.     rsTitles![Title] = txtTitle
  356.     rsTitles![Year Published] = txtYearPublished
  357.     rsTitles![ISBN] = txtISBN
  358.  
  359.     ' The PubID field in the Titles recordset gets the PubID of the
  360.     ' selected publisher, which is in the ItemData associated with the
  361.     ' currently selected item in the list box.
  362.     rsTitles![PubID] = cboPublishers.ItemData(cboPublishers.ListIndex)
  363.  
  364. End Sub
  365.  
  366.  
  367. Private Sub Form_Load()
  368.     Dim db As DATABASE
  369.     Dim dbName As String
  370.  
  371.     On Error GoTo LoadError
  372.  
  373.   ' Get the database name and open the database.
  374.     dbName = BiblioPath()       ' BiblioPath is a function in READINI.BAS
  375.     Set db = DBEngine.Workspaces(0).OpenDatabase(dbName)
  376.  
  377.     ' Open the recordset.
  378.     Set rsTitles = db.OpenRecordset("Titles", dbOpenTable)
  379.  
  380.     If rsTitles.RecordCount > 0 Then
  381.  
  382.         ' We have at least one record, so open a recordset that will be
  383.         ' used to fill the publishers list box.
  384.         Set rsPublishers = db.OpenRecordset("Publishers", dbOpenTable)
  385.  
  386.         If rsPublishers.RecordCount > 0 Then
  387.  
  388.             ' There's at least one publisher, so fill the list box.
  389.             ' Begin by positioning on the first record in the publishers
  390.             ' recordset.
  391.  
  392.             rsPublishers.MoveFirst
  393.  
  394.             Do
  395.                 If Not IsNull(rsPublishers![Company Name]) Then
  396.  
  397.                     ' Add the company name to the list.
  398.                     cboPublishers.AddItem rsPublishers![Company Name]
  399.  
  400.                     ' Associate the PubID with its associated company name.
  401.                     cboPublishers.ItemData(cboPublishers.NewIndex) = _
  402.                         rsPublishers![PubID]
  403.                 End If
  404.  
  405.                 ' Move to the next record in the publishers recordset.
  406.                 rsPublishers.MoveNext
  407.  
  408.             ' If there are publisher records left to process, keep going.
  409.             Loop While Not rsPublishers.EOF
  410.  
  411.             
  412.         End If
  413.  
  414.         ' display the values of the first record in the recordset in
  415.         ' the controls on the form.
  416.         DisplayRecord
  417.         
  418.         ' Set the current index to the default, which is the primary key.
  419.         UpdateMenuStatus "PrimaryKey"
  420.         
  421.     Else
  422.  
  423.         ' An empty recordset, so display an explanation, then terminate.
  424.         MsgBox "There are no records in the Titles table.", vbCritical
  425.         End
  426.     End If
  427. Exit Sub
  428.  
  429. LoadError:
  430.  
  431.     ' An error was generated by Visual Basic or the Jet engine.
  432.     ' Display the error message and terminate gracefully.
  433.     MsgBox Err.Description
  434. End
  435.  
  436. End Sub
  437.  
  438.  
  439. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  440.  
  441.     ' Somebody wants to close the form.
  442.  
  443.     Dim msg As String
  444.  
  445.     On Error GoTo CloseError
  446.  
  447.     If DataChanged Then
  448.  
  449.         ' The user has changed data in the current record. Ask whether
  450.         ' the user wants to save the changes.
  451.         msg = "Do you want to save changes to the current record?"
  452.  
  453.         Select Case MsgBox(msg, vbQuestion + vbYesNoCancel)
  454.             Case vbYes
  455.  
  456.                 ' The user said yes, so save the changes.
  457.                 SaveRecord
  458.  
  459.             Case vbNo
  460.  
  461.                 ' The user said no, so do nothing.
  462.             Case vbCancel
  463.  
  464.                 ' The user clicked Cancel, so cancel the unload event.
  465.                 Cancel = True
  466.         End Select
  467.     End If
  468.  
  469. Exit Sub
  470. CloseError:
  471.     Dim errorMsg As String
  472.  
  473.     ' An error was generated by Visual Basic or the Jet engine.
  474.     ' Display the error message.
  475.     errorMsg = "Error " & Err & " (" & Error$ & ") occurred."
  476.     errorMsg = errorMsg & " RECORD HAS NOT BEEN SAVED!!"
  477.     MsgBox errorMsg, vbExclamation
  478.  
  479.     ' Set the DataChanged flag.
  480.     txtTitle.DataChanged = True
  481. Exit Sub
  482.  
  483. End Sub
  484.  
  485. Private Sub mnuEditUndo_Click()
  486.  
  487.     ' The user clicked Undo, so refresh the controls on the form with
  488.     ' the contents of the current record in the recordset.
  489.     DisplayRecord
  490. End Sub
  491.  
  492. Private Sub mnuFileExit_Click()
  493.     Unload Me
  494. End Sub
  495.  
  496. Private Sub mnuSaveRecord_Click()
  497.  
  498.     ' If the record needs to be saved, save it. Otherwise, just ignore
  499.     ' the click.
  500.     If DataChanged Then SaveRecord
  501. End Sub
  502.  
  503. Private Sub txtISBN_Change()
  504.  
  505.     ' The user has made a change, so set the DataChanged flag to true to
  506.     ' indicate that the record needs to be saved.
  507.     DataChanged = True
  508. End Sub
  509.  
  510. Private Sub txtTitle_Change()
  511.  
  512.     ' The user has made a change, so set the DataChanged flag to true to
  513.     ' indicate that the record needs to be saved.
  514.     DataChanged = True
  515. End Sub
  516.  
  517. Private Sub txtYearPublished_Change()
  518.  
  519.     ' The user has made a change, so set the DataChanged flag to true to
  520.     ' indicate that the record needs to be saved.
  521.     DataChanged = True
  522. End Sub
  523.  
  524. Private Sub cboPublishers_Click()
  525.  
  526.     If Not DisplayingRecord Then
  527.  
  528.         ' We are not in the process of changing to a new record, so if
  529.         ' the user changed to a new publisher, set the DataChanged flag to
  530.         ' True to indicate that the record needs to be saved.
  531.         If cboPublishers.ItemData(cboPublishers.ListIndex) <> _
  532.             rsTitles![PubID] Then DataChanged = True
  533.     End If
  534. End Sub
  535.  
  536.  
  537. Private Sub mnuDataIndexISBN_Click()
  538.     Dim db As DATABASE
  539.     Dim bkMark As Variant
  540.  
  541.     ' Mark the current position.
  542.     bkMark = rsTitles.Bookmark
  543.  
  544.     ' The user clicked the ISBN choice on the Index pop-oup menu. Set
  545.     ' the recordset index to the primary key, which is the ISBN field.
  546.     rsTitles.Index = "PrimaryKey"
  547.  
  548.     ' Check the ISBN choice on the menu.
  549.     UpdateMenuStatus "PrimaryKey"
  550.  
  551.     ' Reset to the marked position.
  552.     rsTitles.Bookmark = bkMark
  553. End Sub
  554.  
  555. Private Sub mnuDataIndexTitle_Click()
  556.     Dim db As DATABASE
  557.     Dim bkMark As Variant
  558.  
  559.     ' Mark the current position.
  560.     bkMark = rsTitles.Bookmark
  561.  
  562.     ' The user clicked the Title choice on the Index pop-oup menu. Set
  563.     ' the recordset index to the Title index.
  564.     rsTitles.Index = "Title"
  565.  
  566.     ' Check the Title choice on the menu.
  567.     UpdateMenuStatus "Title"
  568.  
  569.     ' Reset to the marked position.
  570.     rsTitles.Bookmark = bkMark
  571. End Sub
  572.  
  573. Private Sub mnuDataSeek_Click()
  574.     Dim seekWhat As String
  575.     Dim currentIndex As String
  576.     Dim bkMark As Variant
  577.  
  578.     ' Mark the current record.
  579.     bkMark = rsTitles.Bookmark
  580.  
  581.     ' Find out what the currently active index is.
  582.  
  583.     currentIndex = GetCurrentIndexState()
  584.  
  585.     ' Get the value(s) from the user to be sought.
  586.  
  587.     If currentIndex = "ISBN" Then
  588.         seekWhat = InputBox$("ISBN to seek:", "Customer List")
  589.     Else
  590.         seekWhat = InputBox$("State to seek:", "Customer List")
  591.     End If
  592.  
  593.     ' Seek the requested record. The first argument to the Seek method is
  594.     ' the type of comparison; in this case, it's an equality. The remaining
  595.     ' arguments are the fields in the selected index.
  596.  
  597.     rsTitles.Seek "=", seekWhat
  598.  
  599.     ' If the seek was successful, it points the record pointer to the first
  600.     ' record matching the criteria. In this case, just refresh the form.
  601.     ' If the seek was unsuccessful, inform the user and return to the
  602.     ' originally displayed record.
  603.  
  604.     If Not rsTitles.NoMatch Then
  605.         DisplayRecord
  606.     Else
  607.         MsgBox "Record sought not found!", vbExclamation, "Customer List"
  608.         rsTitles.Bookmark = bkMark
  609.     End If
  610.  
  611. End Sub
  612. Private Function GetCurrentIndexState() As String
  613.  
  614.     ' This function returns the name of the currently active index.
  615.     ' It determines the index by seeing which Index menu item is checked.
  616.  
  617.     If mnuDataIndexISBN.Checked Then
  618.         GetCurrentIndexState = "ISBN"
  619.     Else
  620.         GetCurrentIndexState = "TITLE"
  621.     End If
  622. End Function
  623.  
  624. Private Sub UpdateMenuStatus(ActiveIndex As String)
  625.  
  626.     ' This routine places a check mark beside the currently selected indexing
  627.     ' method.
  628.  
  629.     ' Check the appropriate menu item based on the ActiveIndex argument.
  630.     ' Uncheck all the others.
  631.  
  632.     mnuDataIndexISBN.Checked = IIf(ActiveIndex = "PrimaryKey", True, False)
  633.     mnuDataIndexTitle.Checked = IIf(ActiveIndex = "Title", True, False)
  634.  
  635. End Sub
  636.  
  637.  
  638.